<?php

declare(strict_types=1);

namespace app\common\model;

use Dengje\Pxy\BaseModel;
use app\common\model\user\UserModel;

class ScienceReportModel extends BaseModel
{
    protected $name = 'science_report';
    
    // 定义状态常量
    const STATUS_PENDING = 0;    // 待处理
    const STATUS_PROCESSED = 1;  // 已处理
    const STATUS_REJECTED = 2;   // 驳回
    
    // 状态映射
    public static $statusMap = [
        self::STATUS_PENDING => '待处理',
        self::STATUS_PROCESSED => '已处理',
        self::STATUS_REJECTED => '驳回'
    ];
    
    /**
     * 关联被举报的文章模型
     * @return \think\model\relation\BelongsTo
     */
    public function article()
    {
        return $this->belongsTo(ScienceModel::class, 'article_id', 'id');
    }
    
    /**
     * 关联举报人模型
     * @return \think\model\relation\BelongsTo
     */
    public function user()
    {
        return $this->belongsTo(UserModel::class, 'user_id', 'id');
    }
    
    /**
     * 关联处理管理员模型
     * 注意：这里使用动态方式关联，因为AdminModel的位置可能因项目结构而异
     * @return \think\model\relation\BelongsTo
     */
    public function admin()
    {
        try {
            // 尝试动态获取管理员模型类
            $adminModelClass = 'app\admin\model\AdminModel';
            if (!class_exists($adminModelClass)) {
                $adminModelClass = 'app\common\model\admin\AdminModel';
            }
            return $this->belongsTo($adminModelClass, 'admin_id', 'id');
        } catch (\Exception $e) {
            // 如果找不到管理员模型类，返回一个空的关联
            return $this->belongsTo(UserModel::class, 'admin_id', 'id');
        }
    }
    
    /**
     * 记录举报信息
     * @param int $articleId 文章ID
     * @param int $userId 举报用户ID
     * @param string $reason 举报原因
     * @return bool|int
     */
    public function recordReport(int $articleId, int $userId, string $reason)
    {
        // 检查是否已经存在相同的举报记录
        $exists = $this->where('article_id', $articleId)
            ->where('user_id', $userId)
            ->where('status', self::STATUS_PENDING)
            ->find();
        
        if ($exists) {
            // 如果已存在相同的待处理举报，更新举报时间和原因
            return $exists->save([
                'reason' => $reason,
                'update_time' => time()
            ]);
        }
        
        // 创建新的举报记录
        return $this->save([
            'article_id' => $articleId,
            'user_id' => $userId,
            'reason' => $reason,
            'create_time' => time()
        ]);
    }
    
    /**
     * 处理举报
     * @param int $id 举报记录ID
     * @param int $adminId 管理员ID
     * @param int $status 处理状态
     * @param string $result 处理结果
     * @return bool
     */
    public function handleReport(int $id, int $adminId, int $status, string $result = '')
    {

        $res =  $this->where('id', $id)->update([
            'status' => $status,
            'process_user_id' => $adminId,
            'process_note' => $result,
            'process_time' => time()
        ]);

        if ($res !== false) {
            return true;
        }
    }
}